import Vue from "vue";

/**
 * 分转化为元 - 正则解决精度
 * @param fen
 * @returns {boolean|string}
 */
const regFenToYuan = (fen) => {
  var num = fen;
  num = fen * 0.01;
  num += '';
  var reg = num.indexOf('.') > -1 ? /(\d{1,3})(?=(?:\d{3})+\.)/g : /(\d{1,3})(?=(?:\d{3})+$)/g;
  num = num.replace(reg, '$1');
  num = this.toDecimal2(num);
  return num;
}

/**
 * 元转分 - 解决精度问题 yuan:要转换的钱，单位元； digit：转换倍数
 * @param yuan
 * @param digit
 * @returns {number}
 */
const regYuanToFen = (yuan, digit) => {
  var m = 0,
    s1 = yuan.toString(),
    s2 = digit.toString();
  try {
    m += s1.split(".")[1].length
  } catch (e) {
  }
  try {
    m += s2.split(".")[1].length
  } catch (e) {
  }
  return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
}

/**
 * 判断是否最多两位小数，正负均可
 * @param inputNumber
 * @returns {*|boolean}
 */
const checkTwoPointNum = (inputNumber) => {
  var partten = /^-?\d+\.?\d{0,2}$/;
  return partten.test(inputNumber)
}

/**
 * 强制保留2位小数，如：2，会在2后面补上00.即2.00
 * @param x
 * @returns {string|boolean}
 */
const toDecimal2 = (x) => {
  var f = parseFloat(x);
  if (isNaN(f)) {
    return false;
  }
  var f = Math.round(x * 100) / 100;
  var s = f.toString();
  var rs = s.indexOf('.');
  if (rs < 0) {
    rs = s.length;
    s += '.';
  }
  while (s.length <= rs + 2) {
    s += '0';
  }
  return s;
}

/**
 * 金额转为大写汉子
 * @param money
 * @returns {string}
 */
const priceUppercase = (money) => {
  var cnNums = new Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"); //汉字的数字
  var cnIntRadice = new Array("", "拾", "佰", "仟"); //基本单位
  var cnIntUnits = new Array("", "万", "亿", "兆"); //对应整数部分扩展单位
  var cnDecUnits = new Array("角", "分", "毫", "厘"); //对应小数部分单位
  //var cnInteger = "整"; //整数金额时后面跟的字符
  var cnIntLast = "元"; //整型完以后的单位
  var maxNum = 999999999999999.9999; //最大处理的数字

  var IntegerNum; //金额整数部分
  var DecimalNum; //金额小数部分
  var ChineseStr = ""; //输出的中文金额字符串
  var parts; //分离金额后用的数组，预定义
  if (money == "") {
    return "";
  }
  money = parseFloat(money);
  if (money >= maxNum) {
    // $.alert('超出最大处理数字');
    return "";
  }
  if (money == 0) {
    //ChineseStr = cnNums[0]+cnIntLast+cnInteger;
    ChineseStr = cnNums[0] + cnIntLast
    //document.getElementById("show").value=ChineseStr;
    return ChineseStr;
  }
  money = money.toString(); //转换为字符串
  if (money.indexOf(".") == -1) {
    IntegerNum = money;
    DecimalNum = '';
    cnIntLast = '元整'
  } else {
    parts = money.split(".");
    IntegerNum = parts[0];
    DecimalNum = parts[1].substr(0, 4);
  }
  let zeroCount = 0;
  let IntLen = 0;
  let n;
  let p;
  let m;
  let q;
  let decLen = 0;
  if (parseInt(IntegerNum, 10) > 0) {//获取整型部分转换
    zeroCount = 0;
    IntLen = IntegerNum.length;
    for (var i = 0; i < IntLen; i++) {
      n = IntegerNum.substr(i, 1);
      p = IntLen - i - 1;
      q = p / 4;
      m = p % 4;
      if (n == "0") {
        zeroCount++;
      } else {
        if (zeroCount > 0) {
          ChineseStr += cnNums[0];
        }
        zeroCount = 0; //归零
        ChineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
      }
      if (m == 0 && zeroCount < 4) {
        ChineseStr += cnIntUnits[q];
      }
    }
    ChineseStr += cnIntLast;
    //整型部分处理完毕
  }
  if (DecimalNum != '') {//小数部分
    decLen = DecimalNum.length;
    for (i = 0; i < decLen; i++) {
      n = DecimalNum.substr(i, 1);
      if (n != '0') {
        ChineseStr += cnNums[Number(n)] + cnDecUnits[i];
      }
    }
  }
  if (ChineseStr == '') {
    //ChineseStr += cnNums[0]+cnIntLast+cnInteger;
    ChineseStr += cnNums[0] + cnIntLast;
  }/* else if( DecimalNum == '' ){
              ChineseStr += cnInteger;
              ChineseStr += cnInteger;
          } */
  return ChineseStr;
}

/**
 * 格式化金钱，三位加一个逗号
 * @param num
 * @returns {string}
 */
const priceToThousands = (num) => {
  if (num) {
    num = this.toDecimal2(num)
    //将num中的$,去掉，将num变成一个纯粹的数据格式字符串
    num = num.toString().replace(/\$|\,/g, '');
    //如果num不是数字，则将num置0，并返回
    if ('' == num || isNaN(num)) {
      return 'Not a Number ! ';
    }
    //如果num是负数，则获取她的符号
    var sign = num.indexOf("-") > 0 ? '-' : '';
    //如果存在小数点，则获取数字的小数部分
    var cents = num.indexOf(".") > 0 ? num.substr(num.indexOf(".")) : '';
    cents = cents.length > 1 ? cents : '';//注意：这里如果是使用change方法不断的调用，小数是输入不了的
    //获取数字的整数数部分
    num = num.indexOf(".") > 0 ? num.substring(0, (num.indexOf("."))) : num;
    //如果没有小数点，整数部分不能以0开头
    if ('' == cents) {
      if (num.length > 1 && '0' == num.substr(0, 1)) {
        return 'Not a Number ! ';
      }
    }
    //如果有小数点，且整数的部分的长度大于1，则整数部分不能以0开头
    else {
      if (num.length > 1 && '0' == num.substr(0, 1)) {
        return 'Not a Number ! ';
      }
    }
    //针对整数部分进行格式化处理，这是此方法的核心，也是稍难理解的一个地方，逆向的来思考或者采用简单的事例来实现就容易多了
    /*
      也可以这样想象，现在有一串数字字符串在你面前，如果让你给他家千分位的逗号的话，你是怎么来思考和操作的?
      字符串长度为0/1/2/3时都不用添加
      字符串长度大于3的时候，从右往左数，有三位字符就加一个逗号，然后继续往前数，直到不到往前数少于三位字符为止
     */
    for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
      num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
    }
    //将数据（符号、整数部分、小数部分）整体组合返回
    return (sign + num + cents);
  }
}

Vue.prototype.$regFenToYuan = regFenToYuan
Vue.prototype.$regYuanToFen = regYuanToFen
Vue.prototype.$toDecimal2 = toDecimal2
Vue.prototype.$priceUppercase = priceUppercase
Vue.prototype.$priceToThousands = priceToThousands
Vue.prototype.$checkTwoPointNum = checkTwoPointNum
